var expect = require("chai").expect;

module.exports = function (helpers) {
  var component = helpers.mount(require.resolve("./index"), {});

  var previousComponents = {};

  function checkOrder(letters) {
    component.input = { letters: letters };
    component.update();

    var divs = component.getEl("root").querySelectorAll("div");

    expect(divs.length).to.equal(letters.length);

    var newComponents = {};

    for (var i = 0; i < letters.length; i++) {
      var letter = letters[i];

      var componentForValue = component.getComponent(letter);
      expect(componentForValue != null).to.equal(true);
      newComponents[letter] = componentForValue;

      if (previousComponents[letter]) {
        expect(previousComponents[letter]).to.equal(componentForValue);
      }

      expect(divs[i].id).to.equal(letter);
      expect(divs[i].innerHTML).to.equal(letter);
    }

    Object.keys(previousComponents).forEach(function (letter) {
      if (!(letter in newComponents)) {
        expect(previousComponents[letter].isDestroyed()).to.equal(true);
      }
    });

    previousComponents = newComponents;
  }

  checkOrder(["a", "b", "c", "d", "e"]);

  // Single component swap
  checkOrder(["a", "c", "b", "d", "e"]);

  // Single component removal (remove 'C')
  checkOrder(["a", "b", "d", "e"]);

  // Single component addition
  checkOrder(["a", "b", "c", "d", "e"]);

  // Double component addition
  checkOrder(["a", "b", "b1", "b2", "c", "d", "e"]);

  // Double component removal
  checkOrder(["a", "b", "c", "d", "e"]);

  // Swap b and d
  checkOrder(["a", "d", "c", "b", "e"]);

  // Swap b and d back to normal
  checkOrder(["a", "b", "c", "d", "e"]);

  // Swap a and c
  checkOrder(["c", "b", "a", "d", "e"]);

  // Swap c and a back to normal
  checkOrder(["a", "b", "c", "d", "e"]);

  // Single component addition to START
  checkOrder(["1", "a", "b", "c", "d", "e"]);

  // Double component addition to START
  checkOrder(["3", "2", "1", "a", "b", "c", "d", "e"]);

  // Single component removal from START
  checkOrder(["2", "1", "a", "b", "c", "d", "e"]);

  // Double component removal from START
  checkOrder(["a", "b", "c", "d", "e"]);

  // Single component addition to END
  checkOrder(["a", "b", "c", "d", "e", "f"]);

  // Double component addition to END
  checkOrder(["a", "b", "c", "d", "e", "f", "g", "h"]);

  // Single component removal from END
  checkOrder(["a", "b", "c", "d", "e", "f", "g"]);

  // Double component removal from END
  checkOrder(["a", "b", "c", "d", "e"]);
};
